﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Quarto
{
    public class Motif
    {
        public enum Type_motif {L_gauche = 0, L_droit, Carre, S, Z, T};

        private Type_motif type;
        private bool[,] tab_forme;
        public Type_motif Type
        {
            get { return type; }
            set { type = value; }
        }

        public Motif(Type_motif type_selectionne)
        {
            this.type = type_selectionne;
            if(type_selectionne == Type_motif.L_gauche)
            {
                tab_forme = new bool[3,2];
                tab_forme[0, 0] = true;
                tab_forme[0, 1] = false;
                tab_forme[1, 0] = true;       // ***  
                tab_forme[1, 1] = false;      // --*
                tab_forme[2, 0] = true;
                tab_forme[2, 1] = true;
            }
            if (type_selectionne == Type_motif.L_droit)
            {
                tab_forme = new bool[3, 2];
                tab_forme[0, 0] = false;
                tab_forme[0, 1] = true;
                tab_forme[1, 0] = false;      // --* 
                tab_forme[1, 1] = true;       // ***  
                tab_forme[2, 0] = true;
                tab_forme[2, 1] = true;
            }
            if (type_selectionne == Type_motif.Carre)
            {
                tab_forme = new bool[3, 2];
                tab_forme[0, 1] = true;
                tab_forme[0, 0] = true;
                tab_forme[1, 1] = true;     // **-
                tab_forme[1, 0] = true;     // **-  
                tab_forme[2, 1] = false;
                tab_forme[2, 0] = false;
            }
            if (type_selectionne == Type_motif.S)
            {
                tab_forme = new bool[3, 2];
                tab_forme[0, 0] = false;
                tab_forme[0, 1] = true;
                tab_forme[1, 0] = true;     // -**
                tab_forme[1, 1] = true;     // **-  
                tab_forme[2, 0] = true;
                tab_forme[2, 1] = false;
            }
            if (type_selectionne == Type_motif.Z)
            {
                tab_forme = new bool[3, 2];
                tab_forme[0, 0] = true;
                tab_forme[0, 1] = false;
                tab_forme[1, 0] = true;     // **-
                tab_forme[1, 1] = true;     // -**  
                tab_forme[2, 0] = false;
                tab_forme[2, 1] = true;
            }
            if (type_selectionne == Type_motif.T)
            {
                tab_forme = new bool[3, 2];
                tab_forme[0, 0] = false;
                tab_forme[0, 1] = true;
                tab_forme[1, 0] = true;     // -*-
                tab_forme[1, 1] = true;     // ***  
                tab_forme[2, 0] = false;
                tab_forme[2, 1] = true;
            }
        }

        /// <summary>
        /// Va tester pour le motif si l'une des 4 caractéristiques des pièces permet la victoire
        /// </summary>
        /// <param name="matrice">Tableau 2D de taille 3x2 correspondant à une parcelle de la grille</param>
        /// <returns>Renvoit vrai si il y a une possibilité de victoire</returns>
        public bool test_motif(Case[,] matrice)
        {
            Piece.Couleur? couleur_sauvegarde = null;
            Piece.Forme? forme_sauvegarde = null;
            Piece.Taille? taille_sauvegarde = null;
            Piece.Trou? trou_sauvegarde = null;

            bool couleur = true;
            bool forme = true;
            bool taille = true;
            bool trou = true;

            for(int i = 0; i < 3; i++)
            {
                for(int j = 0; j < 2; j++)
                {
                    if(this.tab_forme[i,j] == true)
                    {
                        if(couleur_sauvegarde == null) /*Si l'une des valeurs est nulle, c'est qu'aucune n'a été remplie*/
                        {
                            if (matrice[i, j].Piece_case != null)
                            {
                                couleur_sauvegarde = matrice[i, j].Piece_case.Couleur_piece;
                                forme_sauvegarde = matrice[i, j].Piece_case.Forme_piece;
                                taille_sauvegarde = matrice[i, j].Piece_case.Taille_piece;
                                trou_sauvegarde = matrice[i, j].Piece_case.Trou_piece;
                            }
                            else
                            {
                                return false;
                            }
                        }
                        else
                        {
                            if (matrice[i, j].Piece_case != null)
                            {
                                if (couleur_sauvegarde != matrice[i, j].Piece_case.Couleur_piece)
                                    couleur = false;
                                if (forme_sauvegarde != matrice[i, j].Piece_case.Forme_piece)
                                    forme = false;
                                if (taille_sauvegarde != matrice[i, j].Piece_case.Taille_piece)
                                    taille = false;
                                if (trou_sauvegarde != matrice[i, j].Piece_case.Trou_piece)
                                    trou = false;
                            }
                            else
                            {
                                couleur = false;
                                forme = false;
                                taille = false;
                                trou = false;
                            }
                        }
                    }
                }
            }

            if (couleur || forme || taille || trou)
                return true;
            else
                return false;
        }

        public static bool test_ligne(Grille g)
        {
            Piece.Couleur? couleur_sauvegarde = null;
            Piece.Forme? forme_sauvegarde = null;
            Piece.Taille? taille_sauvegarde = null;
            Piece.Trou? trou_sauvegarde = null;
            bool couleur;
            bool forme;
            bool taille;
            bool trou;
            
            /*Test des lignes*/
            for( int i = 0; i<4; i++)
            {
                if (g.Tab_case[i, 0].Piece_case != null)
                {
                    couleur = true;
                    forme = true;
                    taille = true;
                    trou = true;
                    if (g.Tab_case[i, 0].Piece_case != null)
                    {
                        couleur_sauvegarde = g.Tab_case[i, 0].Piece_case.Couleur_piece;
                        forme_sauvegarde = g.Tab_case[i, 0].Piece_case.Forme_piece;
                        taille_sauvegarde = g.Tab_case[i, 0].Piece_case.Taille_piece;
                        trou_sauvegarde = g.Tab_case[i, 0].Piece_case.Trou_piece;
                        for (int j = 1; j < 4; j++)
                        {
                            if (g.Tab_case[i, j].Piece_case != null)
                            {
                                if (couleur_sauvegarde != g.Tab_case[i, j].Piece_case.Couleur_piece)
                                    couleur = false;
                                if (forme_sauvegarde != g.Tab_case[i, j].Piece_case.Forme_piece)
                                    forme = false;
                                if (taille_sauvegarde != g.Tab_case[i, j].Piece_case.Taille_piece)
                                    taille = false;
                                if (trou_sauvegarde != g.Tab_case[i, j].Piece_case.Trou_piece)
                                    trou = false;
                            }
                            else
                            {
                                couleur = false;
                                forme = false;
                                taille = false;
                                trou = false;
                            }
                        }
                        if (couleur || forme || taille || trou)
                            return true;
                    }
                }
            }

            /*Test des colonnes*/
            for (int i = 0; i < 4; i++)
            {
                couleur = true;
                forme = true;
                taille = true;
                trou = true;
                if (g.Tab_case[0, i].Piece_case != null)
                {
                    couleur_sauvegarde = g.Tab_case[0, i].Piece_case.Couleur_piece;
                    forme_sauvegarde = g.Tab_case[0, i].Piece_case.Forme_piece;
                    taille_sauvegarde = g.Tab_case[0, i].Piece_case.Taille_piece;
                    trou_sauvegarde = g.Tab_case[0, i].Piece_case.Trou_piece;
                    for (int j = 1; j < 4; j++)
                    {
                        if (g.Tab_case[j, i].Piece_case != null)
                        {
                            if (couleur_sauvegarde != g.Tab_case[j, i].Piece_case.Couleur_piece)
                                couleur = false;
                            if (forme_sauvegarde != g.Tab_case[j, i].Piece_case.Forme_piece)
                                forme = false;
                            if (taille_sauvegarde != g.Tab_case[j, i].Piece_case.Taille_piece)
                                taille = false;
                            if (trou_sauvegarde != g.Tab_case[j, i].Piece_case.Trou_piece)
                                trou = false;
                        }
                        else
                        {
                            couleur = false;
                            forme = false;
                            taille = false;
                            trou = false;
                        }
                    }
                    if (couleur || forme || taille || trou)
                        return true;
                }
            }
            /*Test de la première diagonale*/
            if (g.Tab_case[0, 0].Piece_case != null)
            {
                couleur_sauvegarde = g.Tab_case[0, 0].Piece_case.Couleur_piece;
                forme_sauvegarde = g.Tab_case[0, 0].Piece_case.Forme_piece;
                taille_sauvegarde = g.Tab_case[0, 0].Piece_case.Taille_piece;
                trou_sauvegarde = g.Tab_case[0, 0].Piece_case.Trou_piece;
                couleur = true;
                forme = true;
                taille = true;
                trou = true;
                for (int i = 1; i < 4; i++)
                {
                    if (g.Tab_case[i, i].Piece_case != null)
                    {
                        if (couleur_sauvegarde != g.Tab_case[i, i].Piece_case.Couleur_piece)
                            couleur = false;
                        if (forme_sauvegarde != g.Tab_case[i, i].Piece_case.Forme_piece)
                            forme = false;
                        if (taille_sauvegarde != g.Tab_case[i, i].Piece_case.Taille_piece)
                            taille = false;
                        if (trou_sauvegarde != g.Tab_case[i, i].Piece_case.Trou_piece)
                            trou = false;
                    }
                    else
                    {
                        couleur = false;
                        forme = false;
                        taille = false;
                        trou = false;
                    }
                }
                if (couleur || forme || taille || trou)
                    return true;
            }

            /*Test de la deuxième diagonale*/
            if (g.Tab_case[3, 0].Piece_case != null)
            {
                couleur_sauvegarde = g.Tab_case[3, 0].Piece_case.Couleur_piece;
                forme_sauvegarde = g.Tab_case[3, 0].Piece_case.Forme_piece;
                taille_sauvegarde = g.Tab_case[3, 0].Piece_case.Taille_piece;
                trou_sauvegarde = g.Tab_case[3, 0].Piece_case.Trou_piece;
                couleur = true;
                forme = true;
                taille = true;
                trou = true;
                for (int i = 0; i < 3; i++)
                {
                    if (g.Tab_case[i, 3 - i].Piece_case != null)
                    {
                        if (couleur_sauvegarde != g.Tab_case[i, 3 - i].Piece_case.Couleur_piece)
                            couleur = false;
                        if (forme_sauvegarde != g.Tab_case[i, 3 - i].Piece_case.Forme_piece)
                            forme = false;
                        if (taille_sauvegarde != g.Tab_case[i, 3 - i].Piece_case.Taille_piece)
                            taille = false;
                        if (trou_sauvegarde != g.Tab_case[i, 3 - i].Piece_case.Trou_piece)
                            trou = false;
                    }
                    else
                    {
                        couleur = false;
                        forme = false;
                        taille = false;
                        trou = false;
                    }
                }
                if (couleur || forme || taille || trou)
                    return true;
            }
            return false;
        }
    }
}

